package com.zf.websocket.config;

import com.zf.websocket.handle.ChatHandler;
import com.zf.websocket.handle.HelloHandler;
import com.zf.websocket.handle.ParamHandler;
import com.zf.websocket.handle.PathHandler;
import com.zf.websocket.interceptor.MyHandShakeInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;
import org.springframework.web.socket.server.standard.ServletServerContainerFactoryBean;

/**
 * 启用WebSocket配置:
 * <p>
 * 配置类继承 WebSocketConfigurer 后重写
 * void registerWebSocketHandlers(WebSocketHandlerRegistry registry);
 * 方法来注册 WebSocketHandler 类型的 WebSocket端点。
 */
@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {

    @Autowired
    private HelloHandler helloHandler;
    @Autowired
    private ChatHandler chatHandler;
    @Autowired
    private PathHandler pathHandler;
    @Autowired
    private ParamHandler paramHandler;

    /**
     * 注册 WebSocketHandler 类型的 WebSocket端点
     */
    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        // 注册 WebSocket服务地址 和 处理器
        registry.addHandler(helloHandler, "/hello", "/hello/") // 此处配置的 /hello 这种写法无法匹配 /hello/ ，可以手动加上 /hello/
                .addHandler(chatHandler, "/chat")
                .addHandler(pathHandler, "/path/*", "/path") // 使用通配符 * 匹配一个或多个字符, /path/* 表示只匹配两层的路径且第一层路径是 /path，第二次路径可以是 /，也可以是 /其他
                .addHandler(paramHandler, "/param*", "/param/*") //  /param* 表示只匹配以 /param 开头的一层路径
                // 添加一个握手拦截器
                .addInterceptors(new MyHandShakeInterceptor())
                // 设置跨域
                .setAllowedOrigins("*");
    }

    /**
     * WebSocket容器配置
     */
    @Bean
    public ServletServerContainerFactoryBean createWebSocketContainer() {
        ServletServerContainerFactoryBean container = new ServletServerContainerFactoryBean();
        // 设置文本消息数据缓冲区的大小，单位字节，默认8192
        container.setMaxTextMessageBufferSize(8192);
        // 设置二进制消息数据缓冲区的大小，单位字节，默认8192
        container.setMaxBinaryMessageBufferSize(8192 * 1024);
        // 设置 WebSocketSession的最大空闲时间，如果空闲时间超过设置时间则断开连接，单位ms。默认0表示没有时间限制
        container.setMaxSessionIdleTimeout(500000L);

        return container;
    }
}
